\section{Introdução - Plataforma Java e IDE Eclipse}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Plataforma Java}
\begin{frame}
  \frametitle{O que é Java?}
  \begin{itemize}
    \item Java é uma tecnologia composta por:
    \begin{itemize}
      \item Uma linguagem de programação
      \item Uma plataforma
    \end{itemize}
    \item Criada em $1995$ pela Sun
    \item Tem sintaxe semelhante a da linguagem C++
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Diferença entre um programa em C e um programa em Java}
  \begin{itemize}
    \item Um programa em C é compilado e executado diretamente sobre uma
    plataforma/sistema operacional:
    \begin{figure}[h]
      \centering
      \includegraphics[scale=0.16]{images/ch01_programa_c.png} 
      \end{figure}
    \item A aplicação deve gerenciar seu uso de memória e pode acessar
    diretamente as API's do sistema operacional
    \item Para ser portável, a aplicação deve depender apenas de API's
    presentes em várias plataformas
    \item O código gerado não é independente de plataforma: é preciso
    recompilar o código para diversos sistemas operacionais
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Diferença entre um programa em C e um programa em Java}
  \begin{itemize}
    \item Um programa em Java é compilado para uma linguagem intermediária
    ({\it bytecode}) \begin{figure}[h]
      \centering
      \includegraphics[scale=0.16]{images/ch01_programa_java.png} 
      \end{figure}
    \item A aplicação não gerencia a memória e acessa apenas as API's da
    plataforma Java
    \item O mesmo código compilado pode ser executado em qualquer ambiente onde
    haja uma máquina virtual disponível
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Instalando o Java - JRE e JDK}
  \begin{itemize}
    \item A Sun disponibiliza dois pacotes para instalar o Java: JRE e JDK
    \begin{itemize}
      \item JRE: Java Runtime Environment: Apenas a máquina virtual. Usado
      para executar programas Java
      \item JDK: Java Development Kit: Máquina virtual e ambiente de
      desenvolvimento (compilador, debugger, etc)
    \end{itemize}
    \item Instale o JDK executando o instalador. LEMBRE-SE DE INSTALAR OS
    SOFTWARES DIRETAMENTE NA RAIZ (e.g. ``$C:\backslash jdk1.5.0$'' PARA EVITAR
    PROBLEMAS)
  \end{itemize}
\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{IDE Eclipse}
\begin{frame}
  \frametitle{IDE Eclipse}
  \begin{itemize}
    \item Eclipse é uma IDE criada para trabalhar com a plataforma Java
    \item É escrito em Java e baseado em plugins
    \item É {\it Open Source} 
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Instalando o Eclipse}
  \begin{itemize}
    \item Para instalar o Eclipse, basta extrair o arquivo zip
    \item O JDK deve estar instalado para se executar o Eclipse
    \item A primeira vez que é iniciado, ele pergunta o local onde os projetos
    serão criados (workspace) e mostra uma aba de ``boas vindas''
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Trabalhando com o Eclipse}
  \begin{itemize}
    \item O Eclipse é baseado em ``perspectivas''
    \item Uma perspectiva define quais ``janelas'' (views) são mostradas, seus
    tamanhos e posições.
    \item Exemplos:
    \begin{itemize}
      \item Java: Usada a maior parte do tempo, quando se escreve a aplicação
      \item Debug: Usada para debugar um programa
      \item Team Synchronizing: Usada para controle de versão (e.g. CVS)
    \end{itemize}
    \item Uma view pode ser fechada no símbolo ``$x$'' presente na aba. Para
    abrí-la novamente, vá em $Window \rightarrow Show~View$
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Trabalhando com o Eclipse - Criando um projeto}
  \begin{itemize}
    \item Para criar um projeto, na view ``Package Explorer'', clique com o botão direito,
          $new \rightarrow Project$. Selecione $Java~Project$. Dê um nome ao projeto (e.g. $Hello$)
          e clique em ``Finish''
    \item Dentro do projeto há um diretório chamado ``$src$''. Nesse diretório serão armazenados os
          arquivos fonte Java (.java). Os arquivos compilados (.class) ficam no diretório ``$bin$''
          (que não é exibido no package explorer)
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Trabalhando com o Eclipse - Hello World}
  \begin{itemize}
    \item Para criar uma classe, clique com o botão direito em $src$, $new
    \rightarrow Class$. Dê um nome para a classe (e.g. $Hello$). Marque o
    checkbox ``$public~static~void~main(String[]~args)$'' para gerar o
    esqueleto do método
    \item Com o cursor dentro do método $main$, digite ``$syso$'', e então
    ``$ctrl-space$''. O auto-complete do eclipse gera uma chamada a
    ``$System.out.println();$''. Ponha a String ``$Hello~World!$'' na chamada
    e salve o arquivo.
    \item Ao salvar, a classe é compilada automaticamente
    \item Para executar o programa, clique com o botão direito sobre a classe,
    selecione ``$Run~As \rightarrow Java~Application$''. O programa é
    executado e a saída pode ser vista na view ``$Console$''
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Trabalhando com o Eclipse - Outras funcionalidades}
  \begin{itemize}
    \item ``$Project \rightarrow Clean$'' remove todos os arquivos gerados e
    executa a compilação novamente
    \item Para fechar uma view, clique no `$X$'. Para abrir novamente, vá
    em ``$Window \rightarrow Show~View$'' e selecione a view
  \end{itemize}
\end{frame}
\begin{frame}
  \frametitle{Trabalhando com o Eclipse - Outras funcionalidades}
  \begin{itemize}
    \item Atalhos úteis:
    \begin{itemize}
      \item $ctrl-space$: Code assist
      \item $ctrl-shift-r$: Abre qualuqer arquivo no workspace
      \item $ctrl-o$: Mostra todos os métodos de uma classe
      \item $ctrl-shift-f$: Formata o código fonte da classe aberta
      \item $ctrl-h$: Faz uma busca no workspace
    \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Trabalhando com o Eclipse - Histórico}
  \begin{itemize}
    \item O Eclipse mantém um histórico com as modificações que você fez na classe
    \item Clique na classe criada ($Hello$), vá em ``$Compare~With \rightarrow Local~History$''
    \begin{itemize}
      \item A view ``$history$'' é mostrada com todas as versões
    \end{itemize}
  \end{itemize}
\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Linguagem de programação Java - Introdução}
\begin{frame}
  \frametitle{Linguagem de programação Java}
  \begin{itemize}
    \item Essa seção apresenta uma breve introdução à linguagem java
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Tipos primitivos}
  \begin{itemize}
    \item Toda variável/campo em Java deve ter um tipo
    \item Nem todo tipo em Java é um objeto. Os tipos primitivos são:
    \begin{itemize}
      \item byte, short, int, long: Inteiros, com sinal, de ($8$, $16$, $32$, $64$) bits
      \item float, double: Ponto flutuante de ($32$, $64$) bits
      \item boolean: true ou false
      \item char: Um único caractere (Codificado em Unicode, $16$ bits)
    \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Operadores}
  \begin{itemize}
    \item Os operadores do Java são idênticos aos do C
    \begin{itemize}
      \item $+,~-,~*,~/$: Aritméticos
      \item $var++,~var--$: Incremento/Decremento
      \item $\% $: Módulo
      \item $<~>~<=~>=~==~!=$: Comparação
      \item a = b; a += $5$: Atribuição/Incremento
    \end{itemize}
    \item Exercício: Altere o programa Hello World para declarar duas
    variáveis numéricas, somar os seus valores em outra variável e exibir esse
    resultado
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Wrappers}
  \begin{itemize}
    \item Tipos primitivos não aceitam valor $nulo$
    \item Se for necessário, é preciso utilizar uma classe wrapper
    \begin{itemize}
      \item byte, short, int, long: Byte, Short, Integer, Long
      \item float, double: Float, Double
      \item boolean: Boolean
      \item char: Character
    \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Strings}
  \begin{itemize}
    \item Strings são objetos, e não tipos primitivos
    \item Literais são definidas entre chaves:
    \begin{itemize}
      \item String mensagem = ``Hello world!'';
    \end{itemize}
    \item O operador ``$+$'' concatena duas strings
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Strings: Métodos}
  \begin{itemize}
    \item Alguns dos métodos:
    \begin{itemize}
      \item length(): Tamanho da String
      \item charAt(index): Retorna o caracter em uma determinada posição
      \item equals(anObject)/equalsIgnoreCase(anotherString): Compara duas Strings
      \item substring(beginIndex, endIndex): Retorna uma nova String ``cortando as pontas'' da original.
            A String original nunca é alterada por nenhum método
      \item toLowerCase(), toUpperCase(): Poe em maiúsculas/minúsculas
      \item trim(): Remove os espaços em branco/tabs das bordas
    \end{itemize}
    \item Exercício: Altere o programa Hello World para declarar uma string, colocá-la em lowercase, remover
          os espaços laterais e imprimir seu conteúdo
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Pacotes}
  \begin{itemize}
    \item O código java geralmente é agrupado em pacotes
    \item Um pacote pode conter várias classes. Pacotes são mantidos em uma
    estrutura de árvore, e são separados por $.$
    \item Para criar um pacote, clique com o botão direito em $src$, vá em
    $new\rightarrow Package$. Para criar uma classe nesse pacote, clique com o
    botão direito sobre o pacote, e vá em $new\rightarrow Class$
    \item Cada pacote corresponde a um diretório (pasta) no sistema de arquivos
    \item Exercício: Crie dois pacotes, chamados $projeto.servico$ e
    $projeto.registro$ e crie duas classes: $Pessoa$ e $Endereco$ no pacote
    $projeto.registro$
  \end{itemize}
\end{frame}
\begin{frame}
  \frametitle{Classes e objetos}
  \begin{itemize}
    \item Classes são definidas com $public~class~NomeDaClasse$
    \item Em um mesmo arquivo .java pode-se colocar apenas uma classe pública.
    Classes não-públicas são acessíveis apenas dentro do próprio pacote
    \item Objetos são instanciados com $new~NomeDaClasse()$
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Variáveis e Atributos}
  \begin{itemize}
    \item Variáveis são definidas em escopo de métodos. Atributos são definidos
    em escopo de classe
    \item É uma boa prática que os atributos sejam sempre privados, e acessados
    por $getters$ e $setters$.
    \item Exercício: Na classe pessoa, crie os atributos $nome$, $rg$, $cnh$ e
    $idade$. Na classe $Endereco$, crie os atributos $rua$, $numero$,
    $complemento$, $cidade$, $estado$ e $idPessoa$. Todos os atributos devem ser
    privados. Para gerar os $getters$ e $setters$ clique com o botão direito
    no código fonte, vá em $Source\rightarrow Generate~getters~and~setters$
  \end{itemize}
\end{frame}
    
\begin{frame}
  \frametitle{Herança}
  \begin{itemize}
    \item Herança implementa-se com $public~class~ClasseFilha~extends~ClassePai$
    \item Não existe herança múltipla em Java
    \item Exercício: Implemente uma classe em $projeto,registro$ chamada
    $Cliente$ que herda de $Pessoa$. Em $projeto.servico$ crie a classe
    $ErroSistema$ que herda de $RuntimeException$
    \item Exercício: Implemente o método $toString$ na classe $Pessoa$ (vá em
    $Source\rightarrow Generate~toString$, selecione os campos a serem 
    exibidos e clique em $Ok$). No método $main$ da classe $Hello$ já criada,
    instancie um objeto, defina valores para seus atributos e chame
    $System.out.println(obj)$ passando o objeto como parâmetro
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{List}
  \begin{itemize}
    \item Lista de objetos
    \item Defina como $List<Tipo>$. Itere com $for(Tipo~obj:list)$
    \item Exercício: Instancie duas $Pessoas$, atribua valores e adicione os
    dois objetos a uma lista (instancie a lista com $new ArrayList<Pessoa>()$).
    Itere na lista e imprima os valores
  \end{itemize}
\end{frame}
